{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Introduction"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在这场比赛中，我们被要求预测一个商品销售的价格，所以这是一个回归问题"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np # linear algebra\n",
    "import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n",
    "import matplotlib.pyplot as plt\n",
    "from wordcloud import WordCloud\n",
    "from sklearn.feature_extraction.text import TfidfVectorizer\n",
    "import string\n",
    "\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "train = pd.read_table('train.tsv', engine='c')\n",
    "test = pd.read_table('test.tsv', engine='c')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 导入数据观看数据的维度,是否有缺失值,特征之间的关联度等等"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>train_id</th>\n",
       "      <th>name</th>\n",
       "      <th>item_condition_id</th>\n",
       "      <th>category_name</th>\n",
       "      <th>brand_name</th>\n",
       "      <th>price</th>\n",
       "      <th>shipping</th>\n",
       "      <th>item_description</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>MLB Cincinnati Reds T Shirt Size XL</td>\n",
       "      <td>3</td>\n",
       "      <td>Men/Tops/T-shirts</td>\n",
       "      <td>NaN</td>\n",
       "      <td>10.0</td>\n",
       "      <td>1</td>\n",
       "      <td>No description yet</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>Razer BlackWidow Chroma Keyboard</td>\n",
       "      <td>3</td>\n",
       "      <td>Electronics/Computers &amp; Tablets/Components &amp; P...</td>\n",
       "      <td>Razer</td>\n",
       "      <td>52.0</td>\n",
       "      <td>0</td>\n",
       "      <td>This keyboard is in great condition and works ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2</td>\n",
       "      <td>AVA-VIV Blouse</td>\n",
       "      <td>1</td>\n",
       "      <td>Women/Tops &amp; Blouses/Blouse</td>\n",
       "      <td>Target</td>\n",
       "      <td>10.0</td>\n",
       "      <td>1</td>\n",
       "      <td>Adorable top with a hint of lace and a key hol...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3</td>\n",
       "      <td>Leather Horse Statues</td>\n",
       "      <td>1</td>\n",
       "      <td>Home/Home Décor/Home Décor Accents</td>\n",
       "      <td>NaN</td>\n",
       "      <td>35.0</td>\n",
       "      <td>1</td>\n",
       "      <td>New with tags. Leather horses. Retail for [rm]...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>4</td>\n",
       "      <td>24K GOLD plated rose</td>\n",
       "      <td>1</td>\n",
       "      <td>Women/Jewelry/Necklaces</td>\n",
       "      <td>NaN</td>\n",
       "      <td>44.0</td>\n",
       "      <td>0</td>\n",
       "      <td>Complete with certificate of authenticity</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   train_id                                 name  item_condition_id  \\\n",
       "0         0  MLB Cincinnati Reds T Shirt Size XL                  3   \n",
       "1         1     Razer BlackWidow Chroma Keyboard                  3   \n",
       "2         2                       AVA-VIV Blouse                  1   \n",
       "3         3                Leather Horse Statues                  1   \n",
       "4         4                 24K GOLD plated rose                  1   \n",
       "\n",
       "                                       category_name brand_name  price  \\\n",
       "0                                  Men/Tops/T-shirts        NaN   10.0   \n",
       "1  Electronics/Computers & Tablets/Components & P...      Razer   52.0   \n",
       "2                        Women/Tops & Blouses/Blouse     Target   10.0   \n",
       "3                 Home/Home Décor/Home Décor Accents        NaN   35.0   \n",
       "4                            Women/Jewelry/Necklaces        NaN   44.0   \n",
       "\n",
       "   shipping                                   item_description  \n",
       "0         1                                 No description yet  \n",
       "1         0  This keyboard is in great condition and works ...  \n",
       "2         1  Adorable top with a hint of lace and a key hol...  \n",
       "3         1  New with tags. Leather horses. Retail for [rm]...  \n",
       "4         0          Complete with certificate of authenticity  "
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 查看数据的维度\n",
    "train_id 是数据id  \n",
    "name 是商品名  \n",
    "item_condition_id 是卖方提供的物品状况  \n",
    "category_name 是商品类别  \n",
    "brand_name 是品牌  \n",
    "price 是价格也就是我们要预测的y  \n",
    "shipping 是是否包邮  \n",
    "item_description 是买家评价  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "训练集大小:(1482535, 8)\n",
      "测试集大小:(693359, 7)\n"
     ]
    }
   ],
   "source": [
    "print ('训练集大小:{}\\n测试集大小:{}'.format(train.shape, test.shape))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 目标分布"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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QwIAAACMwfKjzpqX+6464ZA5v+f++++fbbfdNh/96Efn/N73lxAMAAAAgBl55zvfmUWLFs13GzMiBAMAAABgWm699dYsWbIke+yxx3y3MmP2BAMAAADYCB1++OFZsWJFPvGJT2T33XfP4sWL88QnPjHf+ta37hlTVTn55JPz8pe/PNttt11+5Vd+JclgOeRzn/vc+9T7r//6rxx66KF5yEMekgc/+MHZe++9c84559xz/YYbbsgRRxyR7bffPosXL84+++yTr371q3PzY2MmGAAAAMBG64orrsgrX/nKvOlNb8qSJUty7LHH5qCDDsrll1+exYsXJ0lOPPHEPPnJT84//uM/5u67756yzmWXXZZ99903u+22W0499dQsXbo0K1euzA9+8IMkye23354DDzwwN910U0488cQsW7Ys73rXu3LggQfm8ssvzw477DDrv1UIBgAAALCRuu6663LmmWdmn332SZLsueeeecQjHpHTTjstRx55ZJJkxx13zIc//OF11jn++OOz1VZb5bzzzsuSJUuSJE996lPvuf7BD34wF198cS655JI86lGPSpIceOCB2W233XLSSSflxBNPnI2fdx+WQwIAAABspJYtW3ZPAJYku+yyS/bcc8987Wtfu+fcwQcfvN46X/jCF/K85z3vngBssnPPPTd77rlndt1119x111256667kiT77bdfVq5cuYG/YnrMBAMAAADYSC1btmzKcz/+8Y/vOd5+++3XW+f666/PjjvuuNbr1113XS644IIpnyj5iEc8YprdbhghGAAAAMBGavXq1VOee+xjH3vPcVWtt87SpUvvE5xNts0222TFihV517ve9QvXNt9882l2u2EshwQAAADYSK1evTrnn3/+PcdXXnllvv71r2fvvfeeUZ0DDjggZ5xxRm677ba1Xv/Od76TnXfeOStWrLjPa+KJk7PNTDAAAACAjdS2226bF77whXnzm998z9Mhly1blsMPP3xGdY499tjstddeefKTn5xXvepVWbp0ab7xjW9k6dKlefGLX5zf//3fz6mnnpr9998/r371q/Pwhz88119/fb72ta9lhx12yCte8YrZ+YEjhGAAAAAAY7DqhEPmu4UZ22WXXXL00UfnqKOOyhVXXJEVK1bk9NNPz+LFi2dUZ7fddstXvvKVHHXUUXnJS16SJNljjz3yV3/1V0mS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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fb361a39358>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(20, 15))\n",
    "plt.hist(train['price'], bins=50, range=[0,250], label='price')\n",
    "plt.title('Train \"price\" distribution', fontsize=15)\n",
    "plt.xlabel('Price', fontsize=15)\n",
    "plt.ylabel('Samples', fontsize=15)\n",
    "plt.xticks(fontsize=15)\n",
    "plt.yticks(fontsize=15)\n",
    "plt.legend(fontsize=15)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 目标信息"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "count    1.482535e+06\n",
       "mean     2.673752e+01\n",
       "std      3.858607e+01\n",
       "min      0.000000e+00\n",
       "25%      1.000000e+01\n",
       "50%      1.700000e+01\n",
       "75%      2.900000e+01\n",
       "max      2.009000e+03\n",
       "Name: price, dtype: float64"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train['price'].describe()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们看到价格的均值在26.7左右,但是也有像2009那样的最大值,变量分布左偏待会所以让我们对价格进行对数转换"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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Ro3K8ccfn4ULF7Yr89RTT+Xggw/O8OHDs8Yaa2SPPfbIr3/969brTzzxREopmT59eo499tgMGTIk66+/fiZNmpTFixd3O+677ror48ePz+DBgzN48OBss802ue6665Yo95WvfCXrr79+hg0bloMPPjivvfZa67Xbb789pZTMmTOn9VzL8/jUpz6V4cOHZ+jQoTnhhBPypz/9qbXM1KlTU0rJ/fffn/Hjx2fgwIHZdNNNc+ONN7bru+MznDx5ctZaa608+OCD2WGHHbLGGmtk2223zezZs9vVW7hwYT7xiU9k6NChGTFiRE499dRcdNFFtXzjZb9+9cZEQioAAADoBU8++WROOumknHXWWbnmmmvy+uuvZ4899siCBQvalbvgggvy3HPP5Tvf+U67cKitxx57LDvuuGOee+65XHLJJbnxxhuz77775g9/+EOSRrAxceLEzJo1KxdccEFmzpyZkSNHZuLEiXn++ee7HOP48ePbhSR33nlnBgwYsMS58ePHt6t34YUX5tlnn81VV12VU089NZdeemm++tWvtl5/5ZVXMm7cuPz617/OJZdckunTp+fNN9/MxIkTM3/+/HZtnXbaaRk0aFCuv/76HHbYYTnnnHO63cdp3rx52XPPPbPRRhvlhhtuyPXXX5/DDz+8XQCVJNOnT89tt92Wyy67LOeff35uvvnmnHHGGV222/benn766Vx99dU588wzc9lll+Wzn/3sEuUOOuig7LPPPpkxY0a23nrrHHDAAXnooYe6bfutt97KRz/60Rx77LG54YYbsvrqq2e//fbLW2+91e79mDp1aiZNmpSrr746Tz31VC688MIl2vrzn/+81FdVVa3lq6rqUZ23E8v9AAAAoBe89NJLuemmm/K+970vSbLddttl4403ztSpU3Pccce1llt33XUzbdq0bts6++yzM2TIkMyePTsDBw5Mkuy2226t16+66qrMmTMnjzzySDbZZJMkycSJE7PZZpvlwgsvzAUXXNBpu+PHj89pp52WxYsXp1+/fpk9e3aOOuqo1pCoqqrcddddOeecc9rVGz16dKZOnZok2WOPPfKTn/wkM2bMyGmnnZakMYPpzTffzC9+8YsMHz48SbLjjjtm9OjRueKKK3L88ce3tjVhwoTWEGa33XbLLbfckhkzZuTAAw/sdMy/+c1v8vrrr+frX/961lxzzSTJ7rvvvkS5/v37Z+bMmVl11UbU8eijj+baa6/NN7/5za7e5iTJmmuumeuuuy79+vXLBz/4wSxcuDDnnXdePvOZz7TeS5IcffTROeWUU1rfgy222CJTpkzJtdde22Xb8+fPz0UXXZRddtklSePZb7vttrnzzjvzgQ98IC+//HIuu+yynHPOOTnxxBNb2+5sY/ee7HfVdqPzb3/72znyyCOXWqdtsFU3IRUAAAD0glGjRrUGVEljad12222X++67r11I9aEPfWipbf3oRz/KYYcd1hpQdTRr1qxst912eec739luNsxOO+2UBx54oMt2J0yYkHnz5uWhhx7KsGHD8vTTT+e0007LJZdckt/+9rdZuHBhXnnllSVmUnUMhbbYYot2/cyaNSu77bZbBg8e3DqeNddcM9ttt90S4+msraeeeqrLMW+88cYZNGhQDj300Bx99NHZaaedMnTo0CXKvf/9728NqFranTt3bhYtWtRtwLPPPvu0W+a233775cwzz8ycOXMyYcKE1vP77rtv68/9+vXLPvvs0+mSw7ZWW2217Lzzzu3GlCRPP/10kuThhx/OggULsvfee7eWKaVkr732WmKp6P33399tX0nyzne+s/Xnvfbaq0d13k6EVAAAANALRo0a1em55557rt25tddee6ltvfzyy1l33XW7vP7SSy/lnnvu6TR86e7b68aMGZO11lors2fPzrBhw7LVVltlgw02yDbbbJPZs2dn4cKFGTp06BIzeTqGQquttlq7ZYwt4+lshtiuu+66TG11NGzYsNx6662ZPHlyDjzwwCxevDi77757Lr744my00UbdtltVVRYuXNhtSNXxubUcd3xunZXrWKajNddcs10AttpqqyVJ6/22LM0cOXJku3odj5Nkm2226bavJFlllVVafx4+fHiGDBmy1DpvJ0IqAAAA6AVz587t9NyWW27Z7lxPNsQeMWJEtwHI8OHDM3bs2HzrW99a4trqq6/eZb1SSsaNG5fZs2dn6NChrTOFWvaqWrBgQXbcccdl3kB7+PDh2XvvvXPWWWctca1lid6K2GGHHXLLLbdk/vz5mTVrVk466aQceuihueeee1a47Y7PreW4Y0g4d+7cjBgxot1xd0FiT6yzzjpJkhdffLHd0sIXX3xxibKW+wEAAAA9Mnfu3Pz0pz9tXfL31FNP5ec//3mPgoKOdt1110yfPj3nnXdeBgwY0On1H/7wh9lggw06ncHVnQkTJuT888/PkCFDcu6557aeO/XUU7NgwYKccMIJyz3eLbfcssslir1h4MCB2WuvvTJnzpxMmTKlV9q86aabMmXKlNZgbsaMGRk4cOASs8luvPHGbL755kmSxYsX56abbsr222+/Qn1vvfXWGTBgQG666abW/b2qqsr3vve9Jcpa7gcAAAD0yFprrZXDDjssn//85zNw4MBMmjQpo0aNap3ZsiwmTZqU9773vZkwYUJOPvnkjBgxIg8++GBGjBiRj33sY/nIRz6SSy65JDvvvHNOOeWUbLTRRnn55Zdz3333ZZ111mndhLsz48ePz0knnZQXXnihdSbVuHHj8vjjj7deX1YnnXRSrrrqquyyyy454YQTst566+WFF17IHXfckXHjxuWQQw5Z5jZbfP/7388VV1yRD3/4w9lggw3yzDPP5NJLL23djHxFvfHGGznggANyzDHH5JFHHsm5556b448/vt3MpiS5/PLLs9pqq2WrrbbK5Zdfnt/97nf57ne/u0J9jxgxIsccc0wmTZqU/v37Z/PNN8+VV16ZefPmLTHjbuzYscvcdtuZXz3x6KOP5tFHH21djvjAAw9k0KBBGTlyZHbaaadlamt5CKkAAAB4W5qy39Z1D2GZbLjhhjnjjDNy+umn58knn8zYsWNzzTXXdDoTamk222yz3HXXXTn99NNz9NFHJ2lsuv2FL3whSTJgwID8+Mc/zuc+97lMmjQpL7zwQkaNGpXtt9++3Sbcndl2220zaNCgrLvuuq3LzUaOHJkxY8bkiSeeWOYwJGkEdPfcc08++9nP5sQTT8xrr72WddddN+PGjcu73/3uZW6vrXe9610ppeSMM87I3LlzM3LkyOy5556t78WKOvnkk/P73/8+hxxySBYvXpyjjjqq07avvfbanHjiiTnzzDPzjne8I9OmTcu22267wv1/6UtfyqJFizJ58uT069cvhx9+eI466qhcdNFFK9z2spo+fXrOPvvs1uNvfOMb+cY3vpGddtopt99++0rvv7yd1h7WbezYsVV334IAAABA7/vVr37Vuozqb9URRxyROXPmdPvNerz9lFJy8cUX55Of/GSXZaZOnZojjzwyb7zxRgYNGtQn45o4cWIWLVqUO+64o0/6W1FL+x0upfysqqqlpp9mUgEAAADU5Mc//nHuvffevOc978miRYsybdq03HbbbbnuuuvqHlqfE1IBAAAA1GTQoEGZOXNmpkyZkgULFmSTTTbJ1KlTs//++9c9tD5nuV8blvsBAAD0vb+H5X7w31lvLffr16ujAgAAAIDlIKQCAAAAoHZCKgAAAABqJ6QCAAAAoHZCKgAAAABqJ6QCAAAAoHZCKgAAAKjZzjvvnP3337/uYXSqlJKvf/3rdQ+jW6NHj84pp5zSbZnbb789pZTMmTNnpYzh7fwMl8W//Mu/ZJNNNsmAAQOy3Xbb5bbbbuuzvlfts54AAABgWXzvU/X0u9dX+7zLb37zm+nfv3+f9/vfyXve857cfffd2XjjjVdK+38Pz/C73/1ujjvuuEyePDnjxo3LlVdemT333DP3339/ttpqq5Xev5CKHvnMjId7tb0p+23dq+0BAAD8LZo/f34GDhyYLbbYou6h/N0bPHhwdthhh5XW/t/DM5w8eXI++tGP5qyzzkqS7LTTTnnwwQfzxS9+MVddddVK799yPwAAAFhBRxxxRMaOHZuZM2dmzJgxGTBgQMaNG5dHH320XblSSr785S/n05/+dEaOHJmtt278H/idLRX75S9/mb322itDhw7NoEGDsv322+fWW29tvf7KK6/k4x//eNZee+0MGDAg73vf+3Lvvfd2O84NN9wwX/jCF1qPL7300pRS8rWvfa313IUXXpj11luvXb2//OUvOeOMMzJy5MiMGjUqxx9/fBYuXNiuzFNPPZWDDz44w4cPzxprrJE99tgjv/71r1uvP/HEEymlZPr06Tn22GMzZMiQrL/++pk0aVIWL17c7bjvuuuujB8/PoMHD87gwYOzzTbb5Lrrrlui3Fe+8pWsv/76GTZsWA4++OC89tprrdc6W+7X8jw+9alPZfjw4Rk6dGhOOOGE/OlPf2otM3Xq1JRScv/992f8+PEZOHBgNt1009x4443t+u74DCdPnpy11lorDz74YHbYYYesscYa2XbbbTN79ux29RYuXJhPfOITGTp0aEaMGJFTTz01F110UUop3b4nve33v/99fvOb3+TAAw9sPdevX78ccMAB+cEPftAnYxBSAQAAQC948sknc9JJJ+Wss87KNddck9dffz177LFHFixY0K7cBRdckOeeey7f+c532oVDbT322GPZcccd89xzz+WSSy7JjTfemH333Td/+MMfkjSCjYkTJ2bWrFm54IILMnPmzIwcOTITJ07M888/3+UYx48f3y4kufPOOzNgwIAlzo0fP75dvQsvvDDPPvtsrrrqqpx66qm59NJL89Wv/nVZ5CuvvJJx48bl17/+dS655JJMnz49b775ZiZOnJj58+e3a+u0007LoEGDcv311+ewww7LOeeck+uvv77LMc+bNy977rlnNtpoo9xwww25/vrrc/jhh7cLoJJk+vTpue2223LZZZfl/PPPz80335wzzjijy3bb3tvTTz+dq6++OmeeeWYuu+yyfPazn12i3EEHHZR99tknM2bMyNZgpYveAAAgAElEQVRbb50DDjggDz30ULdtv/XWW/noRz+aY489NjfccENWX3317LfffnnrrbfavR9Tp07NpEmTcvXVV+epp57KhRdeuERbf/7zn5f6qqqqtXxVVT2q0+Kxxx5LkowZM6Zdv5tvvnleeeWVvPjii0t9L1eU5X4AAADQC1566aXcdNNNed/73pck2W677bLxxhtn6tSpOe6441rLrbvuupk2bVq3bZ199tkZMmRIZs+enYEDByZJdtttt9brV111VebMmZNHHnkkm2yySZJk4sSJ2WyzzXLhhRfmggsu6LTd8ePH57TTTsvixYvTr1+/zJ49O0cddVRrSFRVVe66666cc8457eqNHj06U6dOTZLsscce+clPfpIZM2bktNNOS9KYwfTmm2/mF7/4RYYPH54k2XHHHTN69OhcccUVOf7441vbmjBhQmsIs9tuu+WWW27JjBkz2s3gaes3v/lNXn/99Xz961/PmmuumSTZfffdlyjXv3//zJw5M6uu2og6Hn300Vx77bX55je/2dXbnCRZc801c91116Vfv3754Ac/mIULF+a8887LZz7zmdZ7SZKjjz66dXP2PfbYI1tssUWmTJmSa6+9tsu258+fn4suuii77LJLksaz33bbbXPnnXfmAx/4QF5++eVcdtllOeecc3LiiSe2tt3Z/k892e/qyiuvzBFHHJEk+fa3v50jjzxyqXVagq1XX301STJ06NB214cNG9Z6feTIkUttb0UIqQAAAKAXjBo1qjWgShpL67bbbrvcd9997UKqD33oQ0tt60c/+lEOO+yw1oCqo1mzZmW77bbLO9/5znazYXbaaac88MADXbY7YcKEzJs3Lw899FCGDRuWp59+OqeddlouueSS/Pa3v83ChQvzyiuvLDGTqmMotMUWW7TrZ9asWdltt90yePDg1vGsueaa2W677ZYYT2dtPfXUU12OeeONN86gQYNy6KGH5uijj85OO+20RJCSJO9///tbA6qWdufOnZtFixZ1G/Dss88+6dfvrwvN9ttvv5x55pmZM2dOJkyY0Hp+3333bf25X79+2WeffTpdctjWaqutlp133rndmJLk6aefTpI8/PDDWbBgQfbee+/WMqWU7LXXXkssFb3//vu77StJ3vnOd7b+vNdee/WoztuJkAoAAAB6wahRozo999xzz7U7t/baay+1rZdffjnrrrtul9dfeuml3HPPPZ2GL919e92YMWOy1lprZfbs2Rk2bFi22mqrbLDBBtlmm20ye/bsLFy4MEOHDl1iJk/HUGi11VZrt4yxZTydzRDbddddl6mtjoYNG5Zbb701kydPzoEHHpjFixdn9913z8UXX5yNNtqo23arqsrChQu7Dak6PreW447PrbNyHct0tOaaa7YLwFZbbbUkab3flqWZHWcodTZjaZtttum2ryRZZZVVWn8ePnx4hgwZstQ6LVpmTL3++uvt3suWGVYt11cmIRUAAAD0grlz53Z6bsstt2x3ricbYo8YMaLbAGT48OEZO3ZsvvWtby1xbfXVV++yXikl48aNy+zZszN06NDWmUIte1UtWLAgO+64Y7tgpSeGDx+evffeu/Vb4dpqWaK3InbYYYfccsstmT9/fmbNmpWTTjophx56aO65554Vbrvjc2s57hgSzp07NyNGjGh33F2Q2BPrrLNOkuTFF19st7Sws/2fVvZyv5a9qB577LFsuOGGrdcfe+yxDB8+fKUv9UuEVAAAANAr5s6dm5/+9KetS/6eeuqp/PznP+9RUNDRrrvumunTp+e8887LgAEDOr3+wx/+MBtssEGnM7i6M2HChJx//vkZMmRIzj333NZzp556ahYsWJATTjhhuce75ZZbdrlEsTcMHDgwe+21V+bMmZMpU6b0Sps33XRTpkyZ0hrMzZgxIwMHDlxiNtmNN96YzTffPEmyePHi3HTTTdl+++1XqO+tt946AwYMyE033dS6v1dVVfne9763RNmVvdxvo402yqabbprrrrsue+yxR5LGfV533XX54Ac/2ON2VoSQCgAAAHrBWmutlcMOOyyf//znM3DgwEyaNCmjRo1qndmyLCZNmpT3vve9mTBhQk4++eSMGDEiDz74YEaMGJGPfexj+chHPpJLLrkkO++8c0455ZRstNFGefnll3PfffdlnXXWad2EuzPjx4/PSSedlBdeeKF1JtW4cePy+OOPt15fVieddFKuuuqq7LLLLjnhhBOy3nrr5YUXXsgdd9yRcePG5ZBDDlnmNlt8//vfzxVXXJEPf/jD2WCDDfLMM8/k0ksvbd2MfEW98cYbOeCAA3LMMcfkkUceybnnnpvjjz++3cymJLn88suz2mqrZauttsrll1+e3/3ud/nud7+7Qn2PGDEixxxzTCZNmpT+/ftn8803z5VXXpl58+YtMeNu7Nixy9x225lfPTF58uQcdthhGT16dHbcccd8+9vfzm9/+9tcc801y9TO8hJSAQAA8Pa011frHsEy2XDDDXPGGWfk9NNPz5NPPpmxY8fmmmuu6XQm1NJsttlmueuuu3L66afn6KOPTtLYdPsLX/hCkmTAgAH58Y9/nM997nOZNGlSXnjhhYwaNSrbb799u024O7Pttttm0KBBWXfddVuXm40cOTJjxozJE088scxhSNII6O6555589rOfzYknnpjXXnst6667bsaNG5d3v/vdy9xeW+9617tSSskZZ5yRuXPnZuTIkdlzzz1b34sVdfLJJ+f3v/99DjnkkCxevDhHHXVUp21fe+21OfHEE3PmmWfmHe94R6ZNm5Ztt912hfv/0pe+lEWLFmXy5Mnp169fDj/88Bx11FG56KKLVrjtZXXIIYfkj3/8Y84///yce+652XLLLXPzzTd3+m2DK0NpWXtIMnbs2Kq7b0H47+wzMx7u1fam7Ld1r7YHAAD87frVr37Vuozqb9URRxyROXPmdPvNerz9lFJy8cUX55Of/GSXZaZOnZojjzwyb7zxRgYNGtQn45o4cWIWLVqUO+64o0/6W1FL+x0upfysqqqlpp9mUgEAAADU5Mc//nHuvffevOc978miRYsybdq03HbbbbnuuuvqHlqfE1IBAAAA1GTQoEGZOXNmpkyZkgULFmSTTTbJ1KlTs//++9c9tD4npAIAAIAVNHXq1LqHwHLoyRZIRxxxxHJtft9T733ve3PPPfestPb/lvSrewAAAAAAYCYV9fjep3q3vb+xb/0AAADaq6oqpZS6hwEso978Qj4zqQAAAKhV//79M3/+/LqH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AAAAAKidkAoAAACA2gmpAAAAAKidkAoAAACA2gmpAAAAAKidkAoAAACA2gmpAAAAAKidkAoAAACA2gmpAAAAAKidkAoAAACA2gmpAAAAAKidkAoAAACA2gmpAAAAAKidkAoAAACA2gmpAAAAAKidkAoAAACA2gmpAAAAAKidkAoAAACA2gmpAAAAAKidkAoAAACA2gmpAAAAAKidkAoAAACA2gmpAAAAAKidkAoAAACA2gmpAAAAAKidkAoAAACA2gmpAAAAAKidkAoAAACA2gmpAAAAAKidkAoAAACA2gmpAAAAAKidkAoAAACA2gmpAAAAAKidkAoAAACA2gmpAAAAAKidkAoAAACA2gmpAAAAAKidkAoAAACA2gmpAAAAAKidkAoAAACA2gmpAAAAAKidkAoAAACA2gmpAAAAAKidkAoAAACA2gmpAAAAAKidkAoAAACA2gmpAAAAAKidkAoAAACA2gmpAAAAAKidkAoAAACA2gmpAAAAAKidkAoAAACA2gmpAAAAAKidkAoAAACA2gmpAAAAAKidkAoAAACA2gmpAAAAAKidkAoAAACA2gmpAAAAAKidkAoAAACA2gmpAAAAAKidkAoAAACA2gmpAAAAAKidkAoAAACA2gmpAAAAAKidkAoAAACA2q1a9wCgV3zvU73b3l5f7d32AAAAgG6ZSQUAAABA7YRUAAAAANROSAUAAABA7YRUAAAAANROSAUAAABA7YRUAAAAANROSAUAAABA7YRUAAAAANROSAUAAABA7YRUAAAAANROSAUAAABA7YRUAAAAANROSAUAAABA7YRUAAAAANROSAUAAABA7YRUAAAAANROSAUAAABA7YRUAAAAANROSAUAAABA7YRUAAAAANROSAUAAABA7YRUAAAAANROSAUAAABA7YRUAAAAANROSAUAAABA7YRUAAAAANROSAUAAABA7YRUAAAAANROSAUAAABA7YRUAAAAANROSAUAAABA7YRUAAAAANROSAUAAABA7YRUAAAAANROSAUAAABA7YRUAAAAANROSAUAAABA7YRUAAAAANROSAUAAABA7YRUAAAAANROSAUAAABA7fo8pCqlbFFKua2U8lYp5dlSyjmllFV6UG9IKeXKUsqrpZTXSylXl1JGdChzdinl4VLKvFLKG6WUB0opB628uwEAAACgN6zal52VUoYl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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fb3383ee470>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(20, 15))\n",
    "bins=50\n",
    "plt.hist(train[train['shipping']==1]['price'], bins, normed=True, range=[0,250],\n",
    "         alpha=0.6, label='price when shipping==1')\n",
    "plt.hist(train[train['shipping']==0]['price'], bins, normed=True, range=[0,250],\n",
    "         alpha=0.6, label='price when shipping==0')\n",
    "plt.title('Train price over shipping type distribution', fontsize=15)\n",
    "plt.xlabel('Price', fontsize=15)\n",
    "plt.ylabel('Normalized Samples', fontsize=15)\n",
    "plt.legend(fontsize=15)\n",
    "plt.xticks(fontsize=15)\n",
    "plt.yticks(fontsize=15)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们发现发货是否包邮,并没有将价格分开.但这并不带表这个特征没有用处"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 填充缺失值"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这里用log1p来处理目标y是因为防止出现0和负数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_train = np.log1p(train['price'])\n",
    "train['category_name'] = train['category_name'].fillna('Other').astype(str)\n",
    "train['brand_name'] = train['brand_name'].fillna('missing').astype(str)\n",
    "train['shipping'] = train['shipping'].astype(str)\n",
    "train['item_condition_id'] = train['item_condition_id'].astype(str)\n",
    "train['item_description'] = train['item_description'].fillna('None')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 文本哑变量化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.pipeline import FeatureUnion\n",
    "from sklearn.feature_extraction.text import CountVectorizer\n",
    "default_preprocessor = CountVectorizer().build_preprocessor()\n",
    "def build_preprocessor(field):\n",
    "    field_idx = list(train.columns).index(field)\n",
    "    return lambda x: default_preprocessor(x[field_idx])\n",
    "    \n",
    "vectorizer = FeatureUnion([\n",
    "    ('name', CountVectorizer(\n",
    "        ngram_range=(1, 2),\n",
    "        max_features=5000,\n",
    "        preprocessor=build_preprocessor('name'))),\n",
    "    ('category_name', CountVectorizer(\n",
    "        token_pattern='.+',\n",
    "        preprocessor=build_preprocessor('category_name'))),\n",
    "    ('brand_name', CountVectorizer(\n",
    "        token_pattern='.+',\n",
    "        preprocessor=build_preprocessor('brand_name'))),\n",
    "    ('shipping', CountVectorizer(\n",
    "        token_pattern='\\d+',\n",
    "        preprocessor=build_preprocessor('shipping'))),\n",
    "    ('item_condition_id', CountVectorizer(\n",
    "        token_pattern='\\d+',\n",
    "        preprocessor=build_preprocessor('item_condition_id'))),\n",
    "    ('item_description', TfidfVectorizer(\n",
    "        ngram_range=(1, 3),\n",
    "        max_features=5000,\n",
    "        preprocessor=build_preprocessor('item_description'))),\n",
    "])\n",
    "X_train = vectorizer.fit_transform(train.values)\n",
    "X_train"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 利用ridge算法进行预测"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_rmsle(y_true, y_pred):\n",
    "    return np.sqrt(mean_squared_log_error(np.expm1(y_true), np.expm1(y_pred)))\n",
    "\n",
    "cv = KFold(n_splits=10, shuffle=True, random_state=42)\n",
    "for train_ids, valid_ids in cv.split(X_train):\n",
    "    model = Ridge(\n",
    "        solver='auto',\n",
    "        fit_intercept=True,\n",
    "        alpha=0.5,\n",
    "        max_iter=100,\n",
    "        normalize=False,\n",
    "        tol=0.05)\n",
    "    model.fit(X_train[train_ids], y_train[train_ids])\n",
    "    y_pred_valid = model.predict(X_train[valid_ids])\n",
    "    rmsle = get_rmsle(y_pred_valid, y_train[valid_ids])\n",
    "    print(f'valid rmsle: {rmsle:.5f}')\n",
    "    break"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 算法精确准确率并不高, 我们可以调高 在文本哑变量化中TfidfVectorizer 的max_feature  参数的值"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 单个ridge模型的准确率不行这时我们就可以用lightgbm了.进行多个模型组合具体可以看代码文件"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
